package com.solo.eggsolo.aop;

import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.solo.eggsolo.entity.Dailylog;
import com.solo.eggsolo.mapper.DailylogMapper;
import com.solo.eggsolo.util.JwtUtil;

/**
 * 
 * @author Yu
 *
 */
@Aspect
@Component
public class LogAspect {

	@Autowired
	private DailylogMapper mapper;

	Logger logger = LoggerFactory.getLogger(LogAspect.class);
	/**
	 * 连接点 : 所有的方法称为连接点 切入点 : 部分连接点，根据切入规则 spring框架提供的表达式
	 */

	@Pointcut("execution(* com.solo.eggsolo.controller.*.*(..)) && @annotation(Logging)")
	public void LogCutPoint() {
		/**
		 * 该方法用来定义切入点的规则 切入点规则的名称就是该方法名 通过该表达式，表示 web层中所有的方法都作为切入点
		 * 只要方法满足切入点规则，spring在程序运行过程中动态添加日志代码
		 * 
		 * 选择所有方法作为添加日志的方法，但当用户登录时， 未提供日志信息中realName token 。。。导致程序错误
		 * 通过提供一个注解设置哪些方法可以添加日志功能
		 */
	}

	@Before("LogCutPoint()")
	public void before() {
		System.out.println("前置通知");
		// 浏览器--请求报文--tomcat-->request对象
		// 1.获取到浏览器访问系统的请求信息
		RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
		ServletRequestAttributes sra = (ServletRequestAttributes) requestAttributes;
		HttpServletRequest request = sra.getRequest();
		// 2.将请求信息封装到日志对象中
		Dailylog log = new Dailylog();
		// 获取请求方式
		log.setRequestMethod(request.getMethod());
		// 获取请求url
		log.setRequestUrl(request.getServletPath());
		// 设置访问执行时间
		log.setTime(new Date());
		// 利用token信息提供username 和 realName
		String token = request.getHeader("Authorization");
		logger.info(" === " +token);
		String username = JwtUtil.getUserId(token);
		Map<String, Object> map = JwtUtil.getInfo(token);
		log.setUserName(username);
		// 3.将日志保存数据库
		mapper.add(log);
		System.out.println("日志插入数据库");
	}
}